/**
 * @file circuit_node_collection.h
 * @author Linquan  
 * @brief   回路节点模块信息
 *          集合了所有回路节点信息：实时状态、配置信息。
 *          
 *          为master_ctr_circuit提供接口，根据设备类型为其提供不同的设备模块函数。
 *              操作node节点的函数:
 *              * 根据多级地址获取节点
 *              * 根据获得的节点，取出对应的节点的配置信息、实时状态信息。
 * 
 * @version 1.0
 * @date 2024-08-11
 * 
 * @copyright Copyright (c) 2024
 * 
 */
#ifndef CIRCUIT_NODE_COLLECTION_H
#define CIRCUIT_NODE_COLLECTION_H




/*===========================[Includes]======================================*/
#include <stdint.h>
#include "circuit_config.h"


#include "circuit_node.h"

/** 节点模块 头文件： */

#include "./circuit_node_mod/mod_sensor_07A_slave.h"
#include "./circuit_node_mod/mod_exti_press.h"
#include "./circuit_node_mod/mod_protect_zone.h"
#include "./circuit_node_mod/mod_relay_mod.h"
#include "./circuit_node_mod/mod_master_91A.h"
#include "./circuit_node_mod/mod_sensor_CO.h"
#include "./circuit_node_mod/mod_sensor_H2.h"
#include "./circuit_node_mod/mod_sensor_smoke.h"
#include "./circuit_node_mod/mod_sensor_temperature.h"
 
/*===========================[Defines]=======================================*/
/*===========================[Macros]========================================*/
/*===========================[Typedef]=======================================*/

/**
 * @brief 回路节点 实时信息的共同体，
 *      如果有新增节点类型，就在这添加。
 * 
 */
typedef union union_circuit_node_rt_data
{
    RT_DATA_TYPE(TYPE_SENSOR_07A_SLAVE)     DEV_RT_DATA(TYPE_SENSOR_07A_SLAVE);
    RT_DATA_TYPE(TYPE_MOD_RELAY)            DEV_RT_DATA(TYPE_MOD_RELAY);
    RT_DATA_TYPE(TYPE_EXTI_PRESS)           DEV_RT_DATA(TYPE_EXTI_PRESS);
    RT_DATA_TYPE(TYPE_CTR_CW1320_91A)       DEV_RT_DATA(TYPE_CTR_CW1320_91A);
    RT_DATA_TYPE(TYPE_PROTECT_ZONE)         DEV_RT_DATA(TYPE_PROTECT_ZONE);
}circuit_node_rt_data_t;


/**
 * @brief 回路节点 配置信息 的共同体
 *      如果有新增节点类型，就在这添加。
 * 
 */
typedef union union_circuit_node_config_t
{
    // 07A的配置信息内容//////
    CONFIG_INFO_TYPE(TYPE_SENSOR_07A_SLAVE)    DEV_CONFIG_INFO(TYPE_SENSOR_07A_SLAVE);
    
     // 中继模块的配置信息内容//////
    CONFIG_INFO_TYPE(TYPE_MOD_RELAY)           DEV_CONFIG_INFO(TYPE_MOD_RELAY);

    // CW1320-91A的配置信息内容//////
    CONFIG_INFO_TYPE(TYPE_CTR_CW1320_91A)      DEV_CONFIG_INFO(TYPE_CTR_CW1320_91A);

    //////防护区集合配置内容
    CONFIG_INFO_TYPE(TYPE_PROTECT_ZONE)        DEV_CONFIG_INFO(TYPE_PROTECT_ZONE);
    
    ////灭火器喷洒策略////
    CONFIG_INFO_TYPE(TYPE_EXTI_PRESS)         DEV_CONFIG_INFO(TYPE_EXTI_PRESS);
}circuit_node_config_t;






/**
 * @brief 用于存储 从设备节点读出的实时运行信息
 *        根据设备类型，判断具体存的是什么信息
 * 
 */
typedef struct 
{
   circuit_node_type_t      node_type; // 设备类型，circuit_node_type_t中的属于真实的设备

    // 不同种类的节点的实时信息数据结构
   circuit_node_rt_data_t   *rt_data_store_ptr;
   
}rt_data_store_t;



/**
 * @brief 用于存储 从设备节点读出的 配置信息
 *        根据设备类型，判断具体存的是什么信息
 * 
 */
typedef struct 
{
   circuit_node_type_t      node_type; // 设备类型，circuit_node_type_t中的属于真实的设备

    // 不同种类的节点的实时信息数据结构
   circuit_node_config_t   *config_data_store_ptr;
   
}config_data_store_t;





/*===========================[Global Prototypes]=============================*/


/**
 * @brief Get the node by node type object
 * 
 * @param *muti_addr 
 */
void get_node_by_muti_addr(muti_addr_t *muti_addr);


/**
 * @brief Get the node config data object
 * 
 * @param node_ptr :the node get from function get_node_by_node_type()
 *                  从get_node_by_node_type函数中获得的节点
 * @param cfg_data :the place of data store, please must check NULL!!!
 *                  从节点中取出配置信息，务必需要检查取出的配置信息指针是否为NULL！！！
 */
void get_node_config_data(circuit_node_t *node_ptr, config_data_store_t *cfg_data);


/**
 * @brief Get the node real time data object
 * 
 * @param node_ptr :the node get from function get_node_by_node_type()
 *                  从get_node_by_node_type函数中获得的节点
 * @param rt_data :the place of data store, please must check NULL!!!
 *                 从节点中取出配置信息，务必需要检查取出的配置信息指针是否为NULL！！！
 */
void get_node_real_time_data(circuit_node_t *node_ptr, rt_data_store_t *rt_data);


#endif
















